package com.sxbbc.seller.interceptor;

import com.sxbbc.common.basics.exceptions.ThrowJsonException;
import com.sxbbc.common.core.entity.jz.BLogin;
import com.sxbbc.seller.common.ActivityMapping;
import com.sxbbc.seller.common.BProductMapping;
import com.sxbbc.seller.common.MappingUtils;
import com.sxbbc.seller.common.OrderMapping;
import com.sxbbc.seller.util.BusinessSession;

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author YQQ
 * @description 登录拦截器
 */
public class LoginInterceptor implements HandlerInterceptor {
	
	/**  
     * 在业务处理器处理请求之前被调用  
     * 如果返回false  
     *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链 
     * 如果返回true  
     *    执行下一个拦截器,直到所有的拦截器都执行完毕  
     *    再执行被拦截的Controller  
     *    然后进入拦截器链,  
     *    从最后一个拦截器往回执行所有的postHandle()  
     *    接着再从最后一个拦截器往回执行所有的afterCompletion()  
     */    
    @Override    
    public boolean preHandle(HttpServletRequest request,    
            HttpServletResponse response, Object handler) throws Exception {  
    	BLogin business = BusinessSession.getBLogin(request);
    	String type = request.getHeader("X-Requested-With");
    	if(business==null){
    		 if ("XMLHttpRequest".equalsIgnoreCase(type)){
        		 response.setHeader("sessionstatus", "timeout"); 
			 }else{
				 response.sendRedirect(MappingUtils.SHOW_LOGIN);
			 }
    		 return false;
    	}else {
            String returnUrl = String.valueOf(request.getServletPath());
            List<String> strs = BusinessSession.getMenuUrl(request);
            strs.add(MappingUtils.SHOW_INDEX);
            strs.add(MappingUtils.SHOW_WELCOME);
            strs.add(MappingUtils.SHOW_USER_EDIT);
            strs.add(MappingUtils.SHOW_ROLE_EDIT);
            strs.add(MappingUtils.UPLOAD_RICH_FILE);
            strs.add(OrderMapping.QUERY_ORDER_LIST);
            strs.add(MappingUtils.SHOW_UPDATE_PASSWORD);
            strs.add(MappingUtils.UPDATE_PASSWORD);
            strs.add(ActivityMapping.SHOW_ADD_SECKILL_DETAIL);
            strs.add(MappingUtils.APPLY_GUARANTEE);
            strs.add(OrderMapping.QUERY_ORDER_EXP_LIST);
            strs.add(OrderMapping.HANDLE_ORDER_UPDATE_EXP);
            strs.add(OrderMapping.EDIT_ORDER_RECEIVE);
            strs.add(MappingUtils.QUERY_HOME_ORDER_MSG);
            strs.add(MappingUtils.QUERY_OFFLINE_LIST);
            strs.add(MappingUtils.UPLOAD_ONE_FILE);
            strs.add(BProductMapping.UPDATE_PRODUCT_DETAIL_IMG);
            strs.add(BProductMapping.QUERY_PRODUCT_DETAIL);
            boolean hasPermission = strs.contains(returnUrl);
            if (StringUtils.equalsIgnoreCase("XMLHttpRequest", type)) {
                if (!hasPermission) {
                    throw new ThrowJsonException("您还没有此功能权限不能操作");
                }
            } else {
                if (!hasPermission) {
                    throw new ThrowJsonException("您还没有此功能权限不能操作");
                }
            }
    	}
        return true;
    }    
    /** 
     * 在业务处理器处理请求执行完成后,生成视图之前执行的动作    
     * 可在modelAndView中加入数据，比如当前时间 
     */  
    @Override    
    public void postHandle(HttpServletRequest request,    
            HttpServletResponse response, Object handler,    
            ModelAndView modelAndView) throws Exception {     
    }    
    
    /**  
     * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   
     * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  
     */    
    @Override    
    public void afterCompletion(HttpServletRequest request,    
            HttpServletResponse response, Object handler, Exception ex)    
            throws Exception {    
    }
}
